<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        var a  
        /*
            # 函数作用域：使用var操作符定义的变量会成为包含它的函数的局部变量，当函数退出时变量也将被销毁。
            # 在函数内部定义变量时省略var操作符，可以创建一个全局变量，该变量将成为window对象的属性
            # 在全局作用域使用var声明的变量将会成为window对象的属性
            # 使用var声明的变量会自动提升到函数作用域顶部。（先使用后声明）
            # 同一作用域下可重复声明变量
            # 后边的声明会覆盖前边的声明。
        */
        let b
         /*
            # let声明的范围是块级作用域。个人认为一个{}就是一个块级作用域。
            # let在全局作用域声明变量时不会成为window对象的属性，不过let声明仍然在全局作用域中发生，
            且相应变量会在页面的生命周期内存续
            # let声明的变量不会再作用域中被提升。
            # 使用var在循环中声明迭代变量会渗透到循环体外部。而使用let不会，JavaScript引擎在后台会
            为每个迭代循环声明一个新的迭代变量

        */
        const c = 0
        /*
            # const声明变量时必须同时初始化变量，且其一经赋值就不能再改变。
            # 如果const变量引用的是一个堆内存类型数据，那么修改这个对象内部的属性并不违反const的限制，指向地址不能修改。
            # 不能用const来声明迭代变量（因为迭代变量会自增）。不过可以声明不被修改的for循环变量。
        */

    </script>
</body>
</html>